import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'

export function getRoute(route: RouteLocationNormalized): RouteLocationNormalized {
  if (!route) return route
  const { matched, ...opt } = route
  return {
    ...opt,
    matched: (matched
      ? matched.map((item) => ({
        meta: item.meta,
        name: item.name,
        path: item.path
      }))
      : undefined) as RouteRecordNormalized[]
  }
}

// 深拷贝
export function cloneDeep(target) {
  if(target === null) {    
    return target  
  }  
  if(target instanceof Date) {    
    return new Date(target.getTime())  
  }  
  if(target instanceof Array) {    
    const cp = [] as any[]    
    (target as any[]).forEach(v => cp.push(v))    
    return cp.map((n: any) =>cloneDeep(n)) as any  
  }  
  if(typeof target === 'object' && target !== {}) {    
    const cp = {...(target as {[key: string]: any})} as { [key: string]: any }    
    Object.keys(cp).forEach(k => {      
      cp[k] =cloneDeep(cp[k])    
    })    
    return cp
  }
};

/**
 * 节流原理：在一定时间内，只能触发一次
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
let time: any;
let flag: boolean = false;
export function throttle(wait: number, fnc: Function, immediate?: boolean) {
  if (immediate) {
    if (!flag) {
      flag = true;
      // 如果是立即执行，则在wait毫秒内开始时执行
      typeof fnc === "function" && fnc();
      time = setTimeout(() => {
        flag = false;
      }, wait);
    }
  } else {
    if (!flag) {
      flag = true;
      // 如果是非立即执行，则在wait毫秒内的结束处执行
      time = setTimeout(() => {
        typeof fnc === "function" && fnc();
        flag = false;
      }, wait);
    }
  }
}

/**
 * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @return null
 */
let timeout: any = null;
export function debounce(fnc: Function, wait: number) {
  if (timeout) {
    clearTimeout(timeout);
    timeout = null;
  }
  timeout = setTimeout(() => {
    typeof fnc === "function" && fnc();
    clearTimeout(timeout);
  }, wait);
};

// 格式化日期
export function formatDate(date, format) {
  var obj = {
    "M+": date.getMonth() + 1,
    "D+": date.getDate(),
    "H+": date.getHours(),
    "m+": date.getMinutes(),
    "s+": date.getSeconds(),
    "q+": Math.floor((date.getMonth() + 3) / 3),
    "S+": date.getMilliseconds(),
  };
  if (/(y+)/i.test(format)) {
    format = format.replace(
      RegExp.$1,
      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }
  for (var k in obj) {
    if (new RegExp("(" + k + ")").test(format)) {
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length == 1
          ? obj[k]
          : ("00" + obj[k]).substr(("" + obj[k]).length)
      );
    }
  }
  return format;
};